#pragma once

#include "Poller.h"

#include <vector>
#include <sys/epoll.h>

class Channel;
/**
 * epoll的使用
 * epoll_create -- 构造、析构
 * epoll_ctl  添加fd和感兴趣的事件  add/mod/del -- updateChannel/removeChannel
 * epoll_wait -- poll
*/

class EPollPoller : public Poller
{
public:
    EPollPoller(EventLoop* loop);
    ~EPollPoller() override;

    // 重写Poller基类的抽象方法
    Timestamp poll(int timeoutMs, ChannelList* activeChannels) override;
    void updateChannel(Channel* channel) override;
    void removeChannel(Channel* channel) override;

private:
    static const int kInitEventListSize = 16;  // 给std::vector<epoll_event>的初始长度
    using EventList = std::vector<epoll_event>;

    // 填写活跃的channel
    void fillActiveChannels(int numEvents, ChannelList *activeChannels) const;
    // 更新channel通道
    void update(int operation, Channel* channel);

    int epollfd_;  // epoll底层特殊的文件系统，epoll_create创建的
    EventList events_;  // epoll_wait的第二个参数（用于接收准备就绪的事件，调用epoll_wait后，events_会被填充为准备就绪的fd和他们关联的事件），epoll_wait的返回值是发生事件的数量
};